--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 6141c07e332096f739be1a2f8fdc3ba612af4031
Parents : b68addb
Author : Mark Qvist <bc7291552be7a58f361522990465165c>
Signature : T66BB85Valid, signed by author
Date : 2026-06-07T13:42:47+02:00
Fixed PTT playback memory leak
Changes
3 files changed, 20 insertions(+), 12 deletions(-)
Diff
diff --git a/sbapp/main.py b/sbapp/main.py
index c9ca2c84..c4899f6f 100644
--- a/sbapp/main.py
+++ b/sbapp/main.py
@@ -22,6 +22,7 @@ import LXMF
import time
import os
import re
+import gc
import pathlib
import base64
import threading
@@ -2446,6 +2447,11 @@ class SidebandApp(MDApp):
self.last_msg_audio = None
return
+ if self.msg_sound:
+ self.msg_sound.release()
+ self.msg_sound = None
+ gc.collect()
+
if audio_field[0] == LXMF.AM_OPUS_OGG:
temp_path = os.path.join(self.sideband.rec_cache, "msg.ogg")
with open(temp_path, "wb") as af: af.write(self.last_msg_audio)
@@ -2465,16 +2471,13 @@ class SidebandApp(MDApp):
else: raise NotImplementedError(audio_field[0])
- if self.msg_sound == None:
- self.msg_sound = FilePlayer()
-
- self.msg_sound.set_source(temp_path)
+ self.msg_sound = FilePlayer(temp_path)
if self.msg_sound != None:
RNS.log("Starting playback", RNS.LOG_DEBUG)
self.msg_sound.play()
- else:
- RNS.log("Playback was requested, but no audio data was loaded for playback", RNS.LOG_ERROR)
+
+ else: RNS.log("Playback was requested, but no audio data was loaded for playback", RNS.LOG_ERROR)
except Exception as e:
RNS.log("Error while playing message audio:"+str(e))
diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py
index 6be50b2e..8010176d 100644
--- a/sbapp/sideband/core.py
+++ b/sbapp/sideband/core.py
@@ -5033,6 +5033,10 @@ class SidebandCore():
self.last_msg_audio = None
return
+ if self.ptt_player:
+ self.ptt_player.release()
+ self.ptt_player = None
+
if audio_field[0] == LXMF.AM_OPUS_OGG:
temp_path = os.path.join(self.rec_cache, "ptt_msg.ogg")
with open(temp_path, "wb") as af: af.write(self.last_msg_audio)
@@ -5054,19 +5058,20 @@ class SidebandCore():
if self.ptt_player == None:
from LXST.Primitives.Players import FilePlayer
- self.ptt_player = FilePlayer()
+ self.ptt_player = FilePlayer(temp_path)
RNS.log("LXMF PTT audio init done", RNS.LOG_DEBUG)
- self.ptt_player.set_source(temp_path)
-
if self.ptt_player != None:
RNS.log("Starting playback", RNS.LOG_DEBUG)
self.ptt_player.play()
while self.ptt_player.playing and time.time() < event_time+ptt_timeout: time.sleep(0.25)
if self.ptt_player.playing: self.ptt_player.stop()
+ self.ptt_player.release()
+ self.ptt_player = None
time.sleep(0.2)
- else:
- RNS.log("Playback was requested, but no audio data was loaded for playback", RNS.LOG_ERROR)
+ gc.collect()
+
+ else: RNS.log("Playback was requested, but no audio data was loaded for playback", RNS.LOG_ERROR)
except Exception as e:
RNS.log("Error while playing message audio:"+str(e))
diff --git a/setup.py b/setup.py
index ac0adb64..b30a9923 100644
--- a/setup.py
+++ b/setup.py
@@ -121,7 +121,7 @@ setuptools.setup(
install_requires=[
"rns>=1.3.5",
"lxmf>=1.0.1",
- "lxst>=0.4.6",
+ "lxst>=0.4.7",
"kivy>=2.3.0",
"numpy>=2.0.0",
"pillow>=10.2.0",
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────